CREATE TABLE FormaPagamento (
  idFormaPagamento INT  NOT NULL   IDENTITY ,
  descricao VARCHAR(40)      ,
PRIMARY KEY(idFormaPagamento));
GO




CREATE TABLE TipoProduto (
  idTipo INT  NOT NULL   IDENTITY ,
  descricao VARCHAR(45)      ,
PRIMARY KEY(idTipo));
GO




CREATE TABLE Uf (
  ufNome VARCHAR(2)  NOT NULL    ,
PRIMARY KEY(ufNome));
GO




CREATE TABLE pagamentosLoja (
  idpagamentosLoja INTEGER  NOT NULL   IDENTITY ,
  descricao TEXT    ,
  valorTotal DECIMAL(10,2)    ,
  valorPago DECIMAL(10,2)    ,
  valorRestante DECIMAL(10,2)    ,
  dataVencimento DATE    ,
  dataPagamento DATE    ,
  situacao Bit      ,
PRIMARY KEY(idpagamentosLoja));
GO




CREATE TABLE PermissoesTela (
  idPermissaoT INTEGER  NOT NULL   IDENTITY ,
  descricaoArea VARCHAR    ,
  area VARCHAR      ,
PRIMARY KEY(idPermissaoT));
GO




CREATE TABLE Cargo (
  idCargo INTEGER  NOT NULL   IDENTITY ,
  descricao VARCHAR(45)    ,
  salarioBase DECIMAL    ,
  cargaHoraria INTEGER      ,
PRIMARY KEY(idCargo));
GO




CREATE TABLE Cidade (
  idCidade INT  NOT NULL   IDENTITY ,
  Uf_ufNome VARCHAR(2)  NOT NULL  ,
  cidade VARCHAR(50)      ,
PRIMARY KEY(idCidade)  ,
  FOREIGN KEY(Uf_ufNome)
    REFERENCES Uf(ufNome));
GO


CREATE INDEX cde_cidade_FKIndex1 ON Cidade (Uf_ufNome);
GO


CREATE INDEX IFK_Rel_04 ON Cidade (Uf_ufNome);
GO


CREATE TABLE Endereco (
  idEndereco INT  NOT NULL   IDENTITY ,
  Cidade_idCidade INT  NOT NULL  ,
  descricao VARCHAR(60)    ,
  complemento VARCHAR(40)    ,
  bairro VARCHAR(50)    ,
  cep VARCHAR(8)    ,
  numero BIGINT      ,
PRIMARY KEY(idEndereco)  ,
  FOREIGN KEY(Cidade_idCidade)
    REFERENCES Cidade(idCidade));
GO


CREATE INDEX end_endereco_FKIndex1 ON Endereco (Cidade_idCidade);
GO


CREATE INDEX IFK_Rel_05 ON Endereco (Cidade_idCidade);
GO


CREATE TABLE Funcionario (
  idFuncionario INTEGER  NOT NULL   IDENTITY ,
  Cargo_idCargo INTEGER  NOT NULL  ,
  Endereco_idEndereco INT  NOT NULL  ,
  codigo INTEGER    ,
  nome VARCHAR(45)    ,
  rg VARCHAR(14)    ,
  cpf VARCHAR(14)    ,
  datanasc DATE  NOT NULL  ,
  tipoTelefone VARCHAR(30)    ,
  fone1 VARCHAR(10)    ,
  celular VARCHAR(10)    ,
  fone2 VARCHAR(10)    ,
  estadoCivil VARCHAR(30)    ,
  sexo CHAR(1)    ,
  situacao Bit    ,
  usuarioEntrada VARCHAR(45)    ,
  dataEntrada DATE    ,
  usuarioAlteracao VARCHAR(45)    ,
  dataAlteracao DATE      ,
PRIMARY KEY(idFuncionario)    ,
  FOREIGN KEY(Endereco_idEndereco)
    REFERENCES Endereco(idEndereco),
  FOREIGN KEY(Cargo_idCargo)
    REFERENCES Cargo(idCargo));
GO


CREATE INDEX fco_funcionario_FKIndex1 ON Funcionario (Endereco_idEndereco);
GO
CREATE INDEX Funcionario_FKIndex2 ON Funcionario (Cargo_idCargo);
GO


CREATE INDEX IFK_Rel_07 ON Funcionario (Endereco_idEndereco);
GO
CREATE INDEX IFK_Rel_20 ON Funcionario (Cargo_idCargo);
GO


CREATE TABLE Login (
  idLogin INTEGER  NOT NULL   IDENTITY ,
  Funcionario_idFuncionario INTEGER  NOT NULL  ,
  usuario VARCHAR(20)    ,
  senha VARCHAR(8)    ,
  usuarioEntrada VARCHAR(20)    ,
  dataEntrada DATE      ,
PRIMARY KEY(idLogin)  ,
  FOREIGN KEY(Funcionario_idFuncionario)
    REFERENCES Funcionario(idFuncionario));
GO


CREATE INDEX lgn_login_FKIndex1 ON Login (Funcionario_idFuncionario);
GO


CREATE INDEX IFK_Rel_06 ON Login (Funcionario_idFuncionario);
GO


CREATE TABLE Cliente (
  IdCliente INT  NOT NULL   IDENTITY ,
  Endereco_idEndereco INT  NOT NULL  ,
  nome VARCHAR(45)    ,
  apelido VARCHAR(45)    ,
  rg VARCHAR(14)    ,
  cpf VARCHAR(14)    ,
  tipoTelefone VARCHAR(30)    ,
  telefone VARCHAR(10)    ,
  celular VARCHAR(10)    ,
  email VARCHAR(70)    ,
  estadoCivil VARCHAR(30)    ,
  sexo CHAR(1)    ,
  datanascimento DATE    ,
  dependentes Bit    ,
  situacao Bit    ,
  usuarioEntrada VARCHAR(20)    ,
  dataEntrada DATE    ,
  usuarioAlteracao VARCHAR(20)    ,
  dataAlteracao DATE      ,
PRIMARY KEY(IdCliente)  ,
  FOREIGN KEY(Endereco_idEndereco)
    REFERENCES Endereco(idEndereco));
GO


CREATE INDEX cne_cliente_FKIndex1 ON Cliente (Endereco_idEndereco);
GO


CREATE INDEX IFK_Rel_06 ON Cliente (Endereco_idEndereco);
GO


CREATE TABLE Dependente (
  idDependente INTEGER  NOT NULL   IDENTITY ,
  Cliente_IdCliente INT  NOT NULL  ,
  nome VARCHAR(45)    ,
  cpf VARCHAR(14)    ,
  observacao TEXT      ,
PRIMARY KEY(idDependente)  ,
  FOREIGN KEY(Cliente_IdCliente)
    REFERENCES Cliente(IdCliente));
GO


CREATE INDEX Dependente_FKIndex1 ON Dependente (Cliente_IdCliente);
GO


CREATE INDEX IFK_Rel_24 ON Dependente (Cliente_IdCliente);
GO


CREATE TABLE Fornecedor (
  idFornecedor INT  NOT NULL   IDENTITY ,
  Endereco_idEndereco INT  NOT NULL  ,
  descricao VARCHAR(45)    ,
  cnpj_cpf VARCHAR(14)    ,
  inscest_rg VARCHAR(20)    ,
  tipoTelefone VARCHAR(30)    ,
  fone1 VARCHAR(10)    ,
  fone2 VARCHAR(10)    ,
  celular VARCHAR(10)    ,
  email VARCHAR(60)    ,
  usuarioEntrada VARCHAR(20)    ,
  dataEntrada DATE    ,
  usuarioAlteracao VARCHAR(20)    ,
  dataAlteracao DATE      ,
PRIMARY KEY(idFornecedor)  ,
  FOREIGN KEY(Endereco_idEndereco)
    REFERENCES Endereco(idEndereco));
GO


CREATE INDEX fcr_fornecedor_FKIndex1 ON Fornecedor (Endereco_idEndereco);
GO


CREATE INDEX IFK_Rel_19 ON Fornecedor (Endereco_idEndereco);
GO


CREATE TABLE Produto (
  idProduto INT  NOT NULL   IDENTITY ,
  Fornecedor_idFornecedor INT  NOT NULL  ,
  TipoProduto_idTipo INT  NOT NULL  ,
  descricao VARCHAR(45)    ,
  quantidade INTEGER    ,
  quantidadeEstoque INTEGER    ,
  valorCompra DECIMAL(10,2)    ,
  valorVenda DECIMAL(10,2)    ,
  valorTotal DECIMAL(10,2)    ,
  fabricante VARCHAR(60)    ,
  unidade VARCHAR(2)    ,
  metrica INTEGER    ,
  classificacao VARCHAR(30)    ,
  percetual INT    ,
  usuarioEntrada VARCHAR(20)    ,
  dataEntrada DATE    ,
  usuarioAlteracao VARCHAR(20)    ,
  dataAlteracao DATE      ,
PRIMARY KEY(idProduto)    ,
  FOREIGN KEY(TipoProduto_idTipo)
    REFERENCES TipoProduto(idTipo),
  FOREIGN KEY(Fornecedor_idFornecedor)
    REFERENCES Fornecedor(idFornecedor));
GO


CREATE INDEX pdo_produto_FKIndex1 ON Produto (TipoProduto_idTipo);
GO
CREATE INDEX Produto_FKIndex2 ON Produto (Fornecedor_idFornecedor);
GO


CREATE INDEX IFK_Rel_14 ON Produto (TipoProduto_idTipo);
GO
CREATE INDEX IFK_Rel_22 ON Produto (Fornecedor_idFornecedor);
GO


CREATE TABLE Permissoes (
  idPermissoes INTEGER  NOT NULL   IDENTITY ,
  Login_idLogin INTEGER  NOT NULL  ,
  PermissoesTela_idPermissaoT INTEGER  NOT NULL    ,
PRIMARY KEY(idPermissoes, Login_idLogin, PermissoesTela_idPermissaoT)    ,
  FOREIGN KEY(PermissoesTela_idPermissaoT)
    REFERENCES PermissoesTela(idPermissaoT),
  FOREIGN KEY(Login_idLogin)
    REFERENCES Login(idLogin));
GO


CREATE INDEX pst_PermissoesTela_has_lgn_login_FKIndex1 ON Permissoes (PermissoesTela_idPermissaoT);
GO
CREATE INDEX pst_PermissoesTela_has_lgn_login_FKIndex2 ON Permissoes (Login_idLogin);
GO


CREATE INDEX IFK_Rel_01 ON Permissoes (PermissoesTela_idPermissaoT);
GO
CREATE INDEX IFK_Rel_02 ON Permissoes (Login_idLogin);
GO


CREATE TABLE Venda (
  idVenda INT  NOT NULL   IDENTITY ,
  FormaPagamento_idFormaPagamento INT  NOT NULL  ,
  Cliente_IdCliente INT  NOT NULL  ,
  Funcionario_idFuncionario INTEGER  NOT NULL  ,
  valorTotal DECIMAL(10,2)    ,
  desconto DECIMAL(10,2)    ,
  valorEntrada DECIMAL(10,2)    ,
  valorAvista DECIMAL(10,2)    ,
  totalLucro DECIMAL(10,2)    ,
  valorPago DECIMAL(10,2)    ,
  parcelas INTEGER    ,
  troco DECIMAL    ,
  dataVenda DATE    ,
  promocao BIT,
  bandeiraCartao VARCHAR(30)    ,
  usuarioEntrada VARCHAR(20)    ,
  dataEntrada DATE    ,
  usuarioAlteracao VARCHAR(20)    ,
  dataAlteracao DATE      ,
PRIMARY KEY(idVenda)      ,
  FOREIGN KEY(FormaPagamento_idFormaPagamento)
    REFERENCES FormaPagamento(idFormaPagamento),
  FOREIGN KEY(Cliente_IdCliente)
    REFERENCES Cliente(IdCliente),
  FOREIGN KEY(Funcionario_idFuncionario)
    REFERENCES Funcionario(idFuncionario));
GO


CREATE INDEX vda_venda_FKIndex1 ON Venda (FormaPagamento_idFormaPagamento);
GO
CREATE INDEX vda_venda_FKIndex3 ON Venda (Cliente_IdCliente);
GO
CREATE INDEX vda_venda_FKIndex4 ON Venda (Funcionario_idFuncionario);
GO


CREATE INDEX IFK_Rel_08 ON Venda (FormaPagamento_idFormaPagamento);
GO
CREATE INDEX IFK_Rel_10 ON Venda (Cliente_IdCliente);
GO
CREATE INDEX IFK_Rel_11 ON Venda (Funcionario_idFuncionario);
GO


CREATE TABLE Parcela (
  idParcela INT  NOT NULL   IDENTITY ,
  Venda_idVenda INT  NOT NULL  ,
  numeroParcela INT    ,
  valorParcela DECIMAL(10,2)    ,
  valorPago DECIMAL(10,2)    ,
  valorRestante DECIMAL(10,2)    ,
  dataVencimento DATE    ,
  dataPagamento DATE    ,
  dataPagRestante DATE    ,
  situacao Bit      ,
PRIMARY KEY(idParcela)  ,
  FOREIGN KEY(Venda_idVenda)
    REFERENCES Venda(idVenda));
GO


CREATE INDEX pca_parcela_FKIndex1 ON Parcela (Venda_idVenda);
GO


CREATE INDEX IFK_Rel_19 ON Parcela (Venda_idVenda);
GO


CREATE TABLE Itemvenda (
  idItemVenda INTEGER  NOT NULL   IDENTITY ,
  Produto_idProduto INT  NOT NULL  ,
  Venda_idVenda INT  NOT NULL  ,
  quantidade INT    ,
  precoUnitario DECIMAL(10,2)    ,
  precoTotal DECIMAL(10,2)      ,
PRIMARY KEY(idItemVenda, Produto_idProduto, Venda_idVenda)    ,
  FOREIGN KEY(Produto_idProduto)
    REFERENCES Produto(idProduto),
  FOREIGN KEY(Venda_idVenda)
    REFERENCES Venda(idVenda));
GO


CREATE INDEX pdo_produto_has_vda_venda_FKIndex1 ON Itemvenda (Produto_idProduto);
GO
CREATE INDEX pdo_produto_has_vda_venda_FKIndex2 ON Itemvenda (Venda_idVenda);
GO


CREATE INDEX IFK_Rel_12 ON Itemvenda (Produto_idProduto);
GO
CREATE INDEX IFK_Rel_13 ON Itemvenda (Venda_idVenda);
GO



